#include<iostream>
#include<vector>

using namespace std;
// 模板类和函数可以实现多种流行和常用的算法和数据结构，如向量、链表、队列、栈。

// C++ 标准模板库的核心包括以下三个组件：

// 组件	描述
// 容器（Containers）	容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器，比如 deque、list、vector、map 等。
// 算法（Algorithms）	算法作用于容器。它们提供了执行各种操作的方式，包括对容器内容执行初始化、排序、搜索和转换等操作。
// 迭代器（iterators）	迭代器用于遍历对象集合的元素。这些集合可能是容器，也可能是容器的子集。
int main()
{
    vector<int> v;
    //size()真实大小
    //capacity()允许最大元素个数
    cout<<"v.size()="<<v.size()<<"  v.capacity()="<<v.capacity()<<endl;
    //仅仅修改capacity()的值,没用真实的内存空间(空间是野的)
    v.reserve(10);
    cout<<"v.size()="<<v.size()<<"  v.capacity()="<<v.capacity()<<endl;
    //容器内的对象内存空间是真实存在的
    v.resize(10);
    v.push_back(0);
    cout<<"v.size()="<<v.size()<<"  v.capacity()="<<v.capacity()<<endl;
    return 0;
}
// 注： 对于 reserve(10) 后接着直接使用 [] 访问越界报错(内存是野的)，大家可以加一行代码试一下，我这里没有贴出来。
// 这里直接用[]访问，vector 退化为数组，不会进行越界的判断。此时推荐使用 at()，会先进行越界检查。
// 相关引申：
// 针对 capacity 这个属性，STL 中的其他容器，如 list map set deque，由于这些容器的内存是散列分布的，因此不会发生类似 realloc() 的调用情况，
//因此我们可以认为 capacity 属性针对这些容器是没有意义的，因此设计时这些容器没有该属性。
// 在 STL 中，拥有 capacity 属性的容器只有 vector 和 string。